#-*-coding:utf-8-*-
#应为django默认会将上传上来的文件存储到本地目录下，实际需求是需要from django.core.files.storage import Storage
# from fdfs_client.client import Fdfs_client
# from django.conf import settings
#
#
# class FastDFSStorage(Storage):
#     '''自定义文件存储系统，修改存储的方案'''
#
#     def __init__(self,client_conf=None,base_url=None):
#         """
#         构造方法,可以不带参数，也可以携带参数
#         :param client_conf: client配置文件路径
#         :param base_url: 文件读取服务器的IP
#         """
#         self.client_conf = client_conf or settings.FDFS_CLIENT_CONF
#         self.base_url = base_url or settings.FDFS_BASE_URL
#
#
#     def _open(self,name,mode='rb'):
#         '''
#         存储类用于打开文件的实际工具'
#         :param name: 要打开的文件名字
#         :param mode: 打开文件方式
#         :return: None
#         '''''
#         #应为自动这个文件存储的类主要是做文件的存储，不会去打开文件，文档告诉我必须实现，但是又没用，所以pass
#
#
#         pass
#
#     def _save(self,name, content):
#         '''
#         保存文件时被调用的 ，抓住这个时机，将上传到django的文件转存到FastDFS
#         :param name: 要保存的文件名字
#         :param content: 要保存的文件内容，是File类型的对象，将来使用content,read()读取文件内容的二进制
#         :return: file_id,会自动的将file_id存储到模型类中对应的ImageField字段下
#
#         '''
#         # client = Fdfs_client('/home/python/Desktop/meiduo_sy10/meiduo_mall/meiduo_mall/utils/fastdfs/client.conf')
#         client = Fdfs_client(self.client_conf)
#         # ret = client.upload_by_filename('/home/python/Desktop/01.jpeg')
#         ret = client.upload_by_buffer(content.read())
#         #判断文件上传是否成功
#         if ret.get('status') != 'Upload successed.':
#             raise Exception('FastDFS upload failed')
#         #如果上传成功读取file_id
#         file_id = ret.get('Remote file_id')
#         return file_id
#
#
#     def exists(self, name):
#         '''
#         判断文件在本地是否存储过‘
#
#         :param name: 要判断的文件名字
#         :return: false ，如果返回false表示本地没有，会去调用save()方法，在save()方法会去_save方法
#         '''
#         return False
#
#     def url(self,name):
#         '''
#         读取文件路径的，必须读取全路径，交给<img src="">
#         :param name: 要读取文件名字
#         :return: None
#         '''
#         # return 'http://192.168.112.130:8888/' + name
#         # print(self.base_url + name)
#         return self.base_url + name
#存储到FastDFS服务器，所以需要自定义文件存储系统，修改存储的方案
#

from django.conf import settings
from django.core.files.storage import Storage
from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client


@deconstructible
class FastDFSStorage(Storage):
    def __init__(self, base_url=None, client_conf=None):
        """
        初始化
        :param base_url: 用于构造图片完整路径使用，图片服务器的域名
        :param client_conf: FastDFS客户端配置文件的路径
        """
        if base_url is None:
            base_url = settings.FDFS_URL
        self.base_url = base_url
        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf

    def _open(self, name, mode='rb'):
        """
        用不到打开文件，所以省略
        """
        pass

    def _save(self, name, content):
        """
        在FastDFS中保存文件
        :param name: 传入的文件名
        :param content: 文件内容
        :return: 保存到数据库中的FastDFS的文件名
        """
        client = Fdfs_client(self.client_conf)
        ret = client.upload_by_buffer(content.read())
        if ret.get("Status") != "Upload successed.":
            raise Exception("upload file failed")
        file_name = ret.get("Remote file_id")
        return file_name

    def url(self, name):
        """
        返回文件的完整URL路径
        :param name: 数据库中保存的文件名
        :return: 完整的URL
        """
        return self.base_url + name

    def exists(self, name):
        """
        判断文件是否存在，FastDFS可以自行解决文件的重名问题
        所以此处返回False，告诉Django上传的都是新文件
        :param name:  文件名
        :return: False
        """
        return False